package util;

import java.io.File;
import java.sql.Connection;
import java.sql.SQLException;

import org.apache.commons.configuration.ConfigurationException;
import org.apache.commons.configuration.XMLConfiguration;

import com.jolbox.bonecp.BoneCP;
import com.jolbox.bonecp.BoneCPConfig;

/**
 * 20110331
 * 
 * @author vsked 数据库连接池类 采用BoneCP连接池
 */
public class Configurations {
	private static BoneCP boneCp;

	private Configurations() {
		try {
			
			XMLConfiguration config = new XMLConfiguration(((new File(
					this.getClass().getResource("/").getPath()).getPath())
					.replace("\\", "/") + "/DBConfig.xml").replace("%20", " "));
			Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
			// 初始化连接池
			BoneCPConfig boneConf = new BoneCPConfig();
			// 数据库URL连接
			boneConf.setJdbcUrl("jdbc:microsoft:sqlserver://"
					+ config.getString("address") + ":"
					+ config.getString("port") + ";databasename="
					+ config.getString("database"));
			// 设置数据库连接用户名
			boneConf.setUsername(config.getString("username"));
			// 设置数据库连接密码
			boneConf.setPassword(config.getString("password"));
			// 设置连接池在每个分区中的最大连接数
			boneConf.setMaxConnectionsPerPartition(50);
			// 设置连接池设在每个分区中的最小连接数
			boneConf.setMinConnectionsPerPartition(10);
			// 连接释放处理
			boneConf.setReleaseHelperThreads(3);
			// 当连接池中的连接耗尽的时候 BoneCP一次同时获取的连接数
			boneConf.setAcquireIncrement(10);
			// 设置分区(设置 3个分区)
			boneConf.setPartitionCount(3);
			// 设置连接空闲时间(分钟)
			boneConf.setIdleMaxAge(40);
			// 每60秒检查所有连接池中的空闲连接
			boneConf.setIdleConnectionTestPeriod(60);
			boneCp = new BoneCP(boneConf);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * 单利模式
	 */
	private static class SingletonHolder {
		static Configurations instance = new Configurations();
	}

	public static Configurations getInstance() {
		return SingletonHolder.instance;
	}

	/**
	 * 获取BoneCP连接池连接
	 * 
	 * @return Connection
	 * @throws SQLException
	 */
	public Connection getConnection() throws SQLException {
		return boneCp.getConnection();
	}

	/**
	 * 关闭连接资源
	 * 
	 * @param conn
	 */
	public static void free(Connection conn) {
		if (conn != null) {
			try {
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}
}
